package com.ms.qw.infraestructura.persistence.jpa.sigar;

import com.ms.qw.client.dto.DosificacionDTO;
import com.ms.qw.client.dto.DosificacionFlt;
import com.ms.qw.client.dto.RecetaDTO;
import com.ms.qw.client.dto.RecetaDetalleDTO;
import com.ms.qw.domain.model.Receta;
import com.ms.qw.domain.model.RecetaRepository;
import com.ms.qw.server.infrastructure.mapper.MSResultTransformer;
import com.ms.qw.server.infrastructure.persistence.util.InClauseConstructor;
import com.ms.qw.server.infrastructure.persistence.util.ValueProvider;
import com.ms.support.jpa.BaseDAO;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

import java.util.List;


/**
 * User: aglwkrs
 * Date: 30/11/11
 */
@Repository
public class RecetaRepositoryImpl extends BaseDAO<Receta, Integer> implements RecetaRepository {

    private final static Logger logger = LoggerFactory.getLogger(RecetaRepositoryImpl.class);


    public List<RecetaDetalleDTO> findDetalle(Integer codigo) {

        StringBuilder sql = new StringBuilder();
        sql.append("SELECT     PDR.iCodDetalle           AS \"codigo\"           , ");
        sql.append("           PDR.dFecCreacion          AS \"fechaCreacion\"           , ");
        sql.append("           PDR.cEstado                AS \"estado\"           , ");
        sql.append("           PDR.cCreadoPor            AS \"creadoPor\"           , ");
        sql.append("           PMD.iCodDosificacion      AS \"codigoDosificacion\" , ");
        sql.append("           PMD.iCodDosificacion      AS \"dosificacion.codigo\" , ");
        sql.append("           PTA.iCodAlimento          AS \"dosificacion.alimento.codigo\"    , ");
        sql.append("           PTA.vAlimento             AS \"dosificacion.alimento.nombre\"    , ");
        sql.append("           PMC.iCodCombinacion       AS \"dosificacion.combinacion.codigo\" , ");
        sql.append("           PMC.vCombinacion          AS \"dosificacion.combinacion.nombre\" , ");
        sql.append("           PMP.iCodPreparacion       AS \"dosificacion.preparacion.codigo\" , ");
        sql.append("           PMP.vPreparacion          AS \"dosificacion.preparacion.nombre\" , ");
        sql.append("           PMD.iCodGrupoEtario       AS \"dosificacion.grupoEtario\" , ");
        sql.append("           PMD.dPesoBrutoGE1         AS \"dosificacion.pesoBrutoGE1\"     , ");
        sql.append("           PMD.dPesoBrutoGE2         AS \"dosificacion.pesoBrutoGE2\"     , ");
        sql.append("           PMD.dPesoNetoGE1          AS \"dosificacion.pesoNetoGE1\"      , ");
        sql.append("           PMD.dPesoNetoGE2          AS \"dosificacion.pesoNetoGE2\" ");
        sql.append("FROM       EQSIGEPSA.PRDETDETALLERECETA PDR ");
        sql.append("           INNER JOIN EQSIGEPSA.PRMOVDOSIFICACION PMD ");
        sql.append("           ON         PMD.iCodDosificacion=PDR.iCodDosificacion ");
        sql.append("           INNER JOIN EQSIGEPSA.PRMAECOMBINACION PMC ");
        sql.append("           ON         PMD.iCodCombinacion= PMC.iCodCombinacion ");
        sql.append("           INNER JOIN EQSIGEPSA.PRMAEPREPARACION PMP ");
        sql.append("           ON         PMP.iCodPreparacion=PMD.iCodPreparacion ");
        sql.append("           INNER JOIN EQSIGEPSA.PRTABALIMENTO PTA ");
        sql.append("           ON         PTA.iCodAlimento=PMD.iCodAlimento ");
        sql.append("WHERE  ");
        sql.append("PDR.iCodReceta =  "+codigo);


        org.hibernate.Query query = em().unwrap(Session.class)
                .createSQLQuery(sql.toString())
                .setResultTransformer(new MSResultTransformer(RecetaDetalleDTO.class));
        return query.list();
    }

    public RecetaDTO findForEdit(Integer codigo) {

        StringBuilder sql = new StringBuilder();
        sql.append("SELECT iCodReceta     as \"codigo\", ");
        sql.append("       vCodRecetaQW   as \"codigoQW\", ");
        sql.append("       cCodRegion     as \"regionAlimentaria\", ");
        sql.append("       iCodTipoReceta as \"codigoTipoReceta\", ");
        sql.append("       iCodCatReceta  as \"codigoCategoriaReceta\", ");
        sql.append("       iCodClaseReceta as \"codigoClaseReceta\",  ");
        sql.append("       vNombreReceta  as \"nombre\", ");
        sql.append("       vAlias         as \"alias\", ");
        sql.append("       dFecCreacion   as \"fechaCreacion\", ");
        sql.append("       iOrden         as \"orden\", ");
        sql.append("       cEstado        as \"estado\", ");
        sql.append("       cCreadoPor     as \"creadoPor\" ");
        sql.append("FROM   [EQSIGEPSA].[PRMAERECETA]");
        sql.append("WHERE  iCodReceta= "+codigo);


        org.hibernate.Query query = em().unwrap(Session.class)
                .createSQLQuery(sql.toString())
                .setResultTransformer(new MSResultTransformer(RecetaDTO.class));
        return (RecetaDTO)query.uniqueResult();
    }

    public List<DosificacionDTO> findDosificaciones(DosificacionFlt dosificacionFlt) {

        String inClause= InClauseConstructor.getInClause(dosificacionFlt.getDosificacionSeleccionadaList(),new ValueProvider() {
            public Object getValue(Object obj) {
                return  obj;
            }
        });

        StringBuilder sql = new StringBuilder();
        sql.append("SELECT     PMD.iCodDosificacion      AS \"codigo\"           , ");
        sql.append("           PTA.iCodAlimento             AS \"alimento.codigo\"    , ");
        sql.append("           PTA.vAlimentoQW             AS \"alimento.nombre\"    , ");
        sql.append("           PMC.iCodCombinacion       AS \"combinacion.codigo\" , ");
        sql.append("           PMC.vCombinacion          AS \"combinacion.nombre\" , ");
        sql.append("           PMP.iCodPreparacion       AS \"preparacion.codigo\" , ");
        sql.append("           PMP.vPreparacion          AS \"preparacion.nombre\" , ");
        sql.append("           PMD.iCodGrupoEtario       AS \"grupoEtario\" , ");
        sql.append("           PMD.dPesoBrutoGE1         AS \"pesoBrutoGE1\"     , ");
        sql.append("           PMD.dPesoBrutoGE2         AS \"pesoBrutoGE2\"     , ");
        sql.append("           PMD.dPesoNetoGE1          AS \"pesoNetoGE1\"      , ");
        sql.append("           PMD.dPesoNetoGE2          AS \"pesoNetoGE2\" ");
        sql.append("FROM       EQSIGEPSA.PRMOVDOSIFICACION PMD ");
        sql.append("           INNER JOIN EQSIGEPSA.PRMAECOMBINACION PMC ");
        sql.append("           ON         PMD.iCodCombinacion= PMC.iCodCombinacion ");
        sql.append("           INNER JOIN EQSIGEPSA.PRMAEPREPARACION PMP ");
        sql.append("           ON         PMP.iCodPreparacion=PMD.iCodPreparacion ");
        sql.append("           INNER JOIN EQSIGEPSA.PRTABALIMENTO PTA ");
        sql.append("           ON         PTA.iCodAlimento=PMD.iCodAlimento ");
        sql.append("WHERE PMD.cEstado='1' ");

        if(StringUtils.isNotBlank(dosificacionFlt.getAlimento())){
            sql.append(" AND PTA.vAlimentoQW like '%"+dosificacionFlt.getAlimento()+"%'");
        }
        if(StringUtils.isNotBlank(dosificacionFlt.getCombinacion())){
            sql.append(" AND  PMC.vCombinacion like '%"+dosificacionFlt.getCombinacion()+"%'");
        }
        if(StringUtils.isNotBlank(dosificacionFlt.getPreparacion())){
            sql.append(" AND PMP.vPreparacion like '%"+dosificacionFlt.getPreparacion()+"%'");
        }
        if(StringUtils.isNotBlank(inClause)){
            sql.append(" AND PMD.iCodDosificacion NOT IN "+inClause);
        }

        org.hibernate.Query query = em().unwrap(Session.class)
                .createSQLQuery(sql.toString())
                .setResultTransformer(new MSResultTransformer(DosificacionDTO.class));
        return query.list();
    }

}
